From: Jan Beulich Date: Mon, 10 Mar 2014 10:04:36 +0000 (+0100) Subject: x86/HVM: consolidate passthrough handling in epte_get_entry_emt() X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~5507 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=3089a6d82bdf3112ccb1dd074ce34a8cbdc4ccd8;p=xen.git x86/HVM: consolidate passthrough handling in epte_get_entry_emt() It is inconsistent to depend on iommu_enabled alone: For a guest without devices passed through to it, it is of no concern whether the IOMMU is enabled. There's one rather special case to take care of: VMX code marks the LAPIC access page as MMIO. The added assertion needs to take this into consideration, and the subsequent handling of the direct MMIO case was inconsistent too: That page would have been WB in the absence of an IOMMU, but UC in the presence of it, while in fact the cachabilty of this page is entirely unrelated to an IOMMU being in use. Signed-off-by: Jan Beulich Reviewed-by: "Xu, Dongxiao" Acked-by: Keir Fraser --- diff --git a/xen/arch/x86/hvm/mtrr.c b/xen/arch/x86/hvm/mtrr.c index b33bf34200..dd1561ead6 100644 --- a/xen/arch/x86/hvm/mtrr.c +++ b/xen/arch/x86/hvm/mtrr.c @@ -698,14 +698,20 @@ uint8_t epte_get_entry_emt(struct domain *d, unsigned long gfn, mfn_t mfn, if ( hvm_get_mem_pinned_cacheattr(d, gfn, &type) ) return type; - if ( !iommu_enabled ) + if ( !iommu_enabled || + (rangeset_is_empty(d->iomem_caps) && + rangeset_is_empty(d->arch.ioport_caps) && + !has_arch_pdevs(d)) ) { + ASSERT(!direct_mmio || + mfn_x(mfn) == d->arch.hvm_domain.vmx.apic_access_mfn); *ipat = 1; return MTRR_TYPE_WRBACK; } if ( direct_mmio ) - return MTRR_TYPE_UNCACHABLE; + return mfn_x(mfn) != d->arch.hvm_domain.vmx.apic_access_mfn + ? MTRR_TYPE_UNCACHABLE : MTRR_TYPE_WRBACK; if ( iommu_snoop ) { diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 8395e8698e..94dc968d41 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -2090,9 +2090,9 @@ static int vmx_alloc_vlapic_mapping(struct domain *d) if ( apic_va == NULL ) return -ENOMEM; share_xen_page_with_guest(virt_to_page(apic_va), d, XENSHARE_writable); + d->arch.hvm_domain.vmx.apic_access_mfn = virt_to_mfn(apic_va); set_mmio_p2m_entry(d, paddr_to_pfn(APIC_DEFAULT_PHYS_BASE), _mfn(virt_to_mfn(apic_va))); - d->arch.hvm_domain.vmx.apic_access_mfn = virt_to_mfn(apic_va); return 0; }